/*
 * Copyright (C) 2019 ~ 2022 Uniontech Software Technology Co.,Ltd.
 *
 * Author:     yanghongwei <yanghongwei@uniontech.com>
 *
 * Maintainer: yanghongwei <yanghongwei@uniontech.com>
 */

#ifndef FILE_NOTIFY_H
#define FILE_NOTIFY_H

#include "common.h"

#include <map>
#include <list>

class AbstractNotify;
class AbstractNotifyProcess;
/**
 * @brief 文件通知
 * 提供外部调用，单例实现
 */
class FileNotify
{
public:
    static FileNotify *instance(); // 获取单例
    ~FileNotify();

    bool init(); // 初始化inotify和fanotify
    bool addNode(const NotifyNode &node, NotifyType notifyType); // 添加一个要监听的节点
    bool removeNode(const NotifyNode &node, NotifyType notifyType); // 移除一个已经监听的节点
    bool addProcess(AbstractNotifyProcess *process); // 添加一个业务处理对象
    bool removeProcess(AbstractNotifyProcess *process); // 移除一个业务处理对象

private:
    FileNotify();

private:
    bool m_isInit; // 是否初始化
    std::map<NotifyType, AbstractNotify *> m_allNotify; // 保存inotify/fanotify的实例
    std::map<NotifyType, std::list<NotifyNode>> m_allNode; // 保存inotify/fanotify的所有监听节点
};

#endif // FILE_NOTIFY_H
